package process

import (
	"chat/client/utils"
	message "chat/common"
	"encoding/json"
	"errors"
	"fmt"
	"net"
	"os"
	"syscall"
)

func ShowMenu() {
secMenu:
	for {
		var key int
		fmt.Println("---------------------------------------------------------------------------------------------")
		fmt.Println()
		fmt.Println("———————————————————————————————————— 欢迎进入聊天室 ——————————————————————————————————————————")
		fmt.Println()
		fmt.Println("———————————————————————————————————— 1.显示在线用户 ——————————————————————————————————————————")
		fmt.Println()
		fmt.Println("———————————————————————————————————— 2.发送消息 —————————————————————————————————————————————")
		fmt.Println()
		fmt.Println("———————————————————————————————————— 3.信息列表 —————————————————————————————————————————————")
		fmt.Println()
		fmt.Println("———————————————————————————————————— 4.退出 —————————————————————————————————————————————————")
		fmt.Println()
		fmt.Println("---------------------------------------------------------------------------------------------")
		fmt.Scanf("%v\n", &key)
		smsProcess := &SmsProcess{}
		switch key {
		case 1:
			// fmt.Println("显示在线用户")
			outPutInlineUser()
		case 2:
			fmt.Println("请输入：")
			var content string
			fmt.Scanln(&content)
			smsProcess.SendGroupMes(content)
		case 3:
			fmt.Println("信息列表")
		case 4:
			fmt.Println("退出")
			break secMenu
		}
	}
}

func processServerMes(conn net.Conn) {
	tf := &utils.Transfer{
		Conn: conn,
	}
	for {
		mes, err := tf.ReadPkg()
		if err != nil {
			handleNetworkError(err)
			return
		}
		switch mes.Type {
		case message.NotifyUserStatusMesType:
			var notifyUserStatusMes message.NotifyUserStatusMes
			json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
			updateUserStatus(&notifyUserStatusMes)
		case message.SmsMesType:
			var smsMes message.SmsMes
			json.Unmarshal([]byte(mes.Data), &smsMes)
			getSmsMes(smsMes)
		default:
			fmt.Println("枚举错误")
		}
	}
}

func handleNetworkError(err error) {
	if errors.Is(err, net.ErrClosed) {
		fmt.Println("网络连接已关闭")
		return
	}
	if opErr, ok := err.(*net.OpError); ok {
		if syscallErr, ok := opErr.Err.(*os.SyscallError); ok {
			if errno, ok := syscallErr.Err.(syscall.Errno); ok {
				switch errno {
				case syscall.WSAECONNRESET:
					fmt.Println("连接被远程主机强制关闭")
					return
				case syscall.ECONNRESET:
					fmt.Println("连接被重置")
					return
				}
			}
		}
		fmt.Println("网络操作错误：", opErr)
	} else {
		fmt.Println("其他错误：", err)
	}
}
